/**
 * DoubleUtils.java
 * Created at Apr 4, 2014
 * Created by Jackie
 * Copyright (C) 2014, All rights reserved.
 */
package com.huabo.utils;

import java.math.BigDecimal;

/**
 * <p>ClassName: DoubleUtils</p>
 * <p>Description: double计算工具类</p>
 * <p>Author: Jackie</p>
 * <p>Date: Apr 4, 2014</p>
 */
public class DoubleUtils {

	// 默认除法运算精度  
    private static final Integer DEF_DIV_SCALE = 2;  
  
    private static BigDecimal getDeciaml(double value) {
    	return new BigDecimal(Double.toString(value));
    }
    
    /** 
     * 提供精确的加法运算。 
     * @param value1 被加数 
     * @param value2 加数 
     * @return 两个参数的和 
     */  
    public static double add(double value1, double value2) {  
        BigDecimal b1 = getDeciaml(value1);  
        BigDecimal b2 = getDeciaml(value2);  
        return b1.add(b2).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
  
    /** 
     * 提供精确的减法运算。 
     * @param value1 被减数 
     * @param value2 减数 
     * @return 两个参数的差 
     */  
    public static double sub(double value1, double value2) {  
    	BigDecimal b1 = getDeciaml(value1);  
        BigDecimal b2 = getDeciaml(value2);
        return b1.subtract(b2).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
  
    /** 
     * 提供精确的乘法运算。 
     * @param value1 被乘数 
     * @param value2 乘数 
     * @return 两个参数的积 
     */  
    public static double mul(double value1, double value2) {  
    	BigDecimal b1 = getDeciaml(value1);  
        BigDecimal b2 = getDeciaml(value2);   
        return b1.multiply(b2).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
  
    /** 
     * 提供（相对）精确的除法运算，当发生除不尽的情况时， 精确到小数点以后10位，以后的数字四舍五入。 
     * @param dividend 被除数 
     * @param divisor 除数 
     * @return 两个参数的商 
     */  
    public static double div(double value1, double value2) {  
        return div(value1, value2, DEF_DIV_SCALE);  
    }  
  
    /** 
     * 提供（相对）精确的除法运算。 当发生除不尽的情况时，由scale参数指定精度，以后的数字四舍五入。 
     * @param dividend 被除数 
     * @param divisor 除数 
     * @param scale 表示表示需要精确到小数点以后几位。 
     * @return 两个参数的商 
     */  
    public static double div(double value1, double value2, int scale) {  
        if (scale < 0) {  
            throw new IllegalArgumentException( "The scale must be a positive integer or zero");  
        }  
        BigDecimal b1 = getDeciaml(value1);  
        BigDecimal b2 = getDeciaml(value2);  
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
  
    /** 
     * 提供精确的小数位四舍五入处理。 
     * @param value 需要四舍五入的数字 
     * @param scale 小数点后保留几位 
     * @return 四舍五入后的结果 
     */  
    public static double round(Double value, Integer scale) {  
        if (scale < 0) {  
            throw new IllegalArgumentException("The scale must be a positive integer or zero");  
        }  
        BigDecimal b = new BigDecimal(Double.toString(value));  
        BigDecimal one = new BigDecimal("1");  
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
    
    /*public static void main(String[] args) {
		System.out.println("add = " + add(10.12, 5.88888));
		System.out.println("sub = " + sub(10.12, 5.88888));
		System.out.println("mul = " + mul(10.12, 5.88888));
		System.out.println("div = " + div(10.12, 5.88888));
	}*/
}
